/*
 * @Author: HZK
 * @Date: 2020-08-26 14:45:41
 * @LastEditTime: 2020-08-28 15:49:06
 * @LastEditors: hanfengmi
 * @Description: 
 */

// console.log(123)
// if(true){
//     // var foo = 'qq'
//     const foo = 'qq'
//     console.log(foo) // 外部无法使用
// }

// for (let index = 0; index < 3; index++) {
//     for (let index = 0; index < 3; index++) {
//         console.log(index)
//     }
// }

// 点击事件

// 变量提升

//数组解构
// const arr = [ 100, 200, 300 ]
// const [,,c] = arr
// console.log(c)

// // 对象解构
// const obj = {}

// const name = "jsjs";
// // :重命名
// const {name:myname = 'yyy'} = obj
// console.log(name, myname)


// 模板字符串
``
// console.log(`wqeqwe`)
// console.log(`wqeq\`we`)
// const name = 'sss'
// const age = 12
// const str = console.log`sss`
// // 标签函数 对模板进行加工
// function myTagFunc (strings, name, age){
//     console.log(strings)
// }

// const result = myTagFunc`ns ${name} age:${age}。。`

// proxy

// const person = {
//     name:'xixix',
//     age:12
// }

// const personProxy = new Proxy(person,{
//     deleteProxy (target,property) {
//         console.log('detele', property)
//         delete target[property]
//     }
// })

// delete personProxy.age
// console.log(PerformanceResourceTiming)

// proxy 监视数组
// 重写方法

// const list = []
// const listProxy = new Proxy(list,{
//     set (target,property,value) {
//       console.log('set',property,value);
//       target[property] = value;
//       return true 
//     }
// })

// listProxy.push(100)
// listProxy.push(101)

// 非侵入方式去监视对象

// const obj = {
//     name:'zcs',
//     age:18
// }

// // console.log('name' in obj)
// // console.log(delete obj['age'])
// // console.log(Object.keys(obj))

// console.log(Reflect.has(obj,'name'))
// console.log(Reflect.deleteProperty(obj,'age'))
// console.log(Reflect.ownKeys(obj))

// class类

// function Person (name) {
//     this.name =name
// }

// Person.prototype.say = function(){
//     console(this.name)
// }

// class Person {
//     constructor(name){// 构造函数
//         this.name= name
//     }
//     say(){
//         console.log(this.name)
//     }
// }

// const p = new Person()

// p.say()

// 实例方法+静态方法
// static
// class Person {
//     constructor(name){// 构造函数
//         this.name= name
//     }
//     say(){
//         console.log(this.name)
//     }

//     static create(name){
//         return new Person(name)
//     }
// }

// const tom = Person.create('tom')
// tom.say()

// // 继承
// // extends

// class Student extends Person{
//     constructor(name, number){
//         super(name)
//         this.number = number
//     }
//     hello (){
//         super.say()
//         console.log(this.number)
//     }
// }

// const s = new Student('jack',200)
// s.hello()


// Set

// const s = new Set()

// s.add(1).add(1).add(2).add(3)

// console.log(s)

// s.forEach(i => console.log(i))

// console.log(s.size) //。length
// console.log(s.has(100)) // true
// console.log(s.delete(100)) // false
// console.log(s.clear(100)) // true

// const arr = [1,2,3,2,4,5]
// const result = Array.from(new Set(arr))

// console.log(result)

// Map 数据结构

// const obj = {}
// obj[true] = "value"
// obj[123] = "value"
// obj[{a:1}] = "value1"

// console.log(Object.keys(obj)) // 键值转化成字符串
// console.log(obj[{}]) // 键值转化成字符串
// // 任意类型作为键值
// const m = new Map();
// const tom = {name : 'tom'}
// m.set(tom,90)
// console.log(m)
// console.log(m.get(tom))
// // console.log(m.forEach())

// Symbol 表示独一无二的值
// const cache = {}

// cache['foo'] = Math.random()

// cache['foo'] = '123'

// console.log(cache)

// const s = Symbol()
// console.log(s === Symbol())
// console.log(Symbol('foo'))
// console.log(Symbol('bar'))
// console.log(Symbol('bas'))
// const obj = {
//     [Symbol()]:123,
//     [Symbol()]:456,
// }
// console.log(obj)

// const name2 = Symbol()
//  const person = {
//      [name2]:'zxc',
//      say(){
//          console.log(this[name])
//      }
//  }


// console.log(person[name2])
// // 唯一性
// console.log(Symbol('a') === Symbol('a') )

// 使用全局
// const s1 = Symbol.for('aaa')
// const ss1 = Symbol('aaa')
// const ss2 = Symbol('aaa')
// const s2 = Symbol.for('aaa')
// console.log(s1 === s2)
// console.log(ss1 === ss2)

// const obj = {
//     [Symbol.toStringTag]:'MyObject',
//     'a':123
// }
// // Symbol 会被忽略掉
// console.log(obj.toString())
// // 只获取Symbol属性
// console.log(Object.getOwnPropertySymbols(obj))

// 遍历
// for of
// const a = [1,2,3,4,5]
// for (const value of a) {// 每个元素
//     console.log(value)
//     // break
//     if(value >2){
//         break
//     }
// }

// const s = new Set(['foo','asc'])
// for (const value of s) {
//     console.log(value)
// }

// const m = new Map();
// m.set('name','hzk')
// m.set('age',100)
// m.set('aa','2ww')

// for (const [key,value] of m) {
//     console.log(key, value)
// }

// const obj = {
//     'name':'asd',
//     age:123
// }

// for (const value of obj) {
//     // 报错 Iterable接口可迭代
//     console.log(value)
// }

// iterator

// const set = new Set(['foo','test','baba'])

// const iterator = set[Symbol.iterator]()

// console.log(iterator.next())
// console.log(iterator.next())
// console.log(iterator.next())
// console.log(iterator.next())


// const obj = {
//     [Symbol.iterator]:function(){ // iterable
//         return {
//             next:function(){ // iterator
//                 return { // iterationResult
//                     value: 'zsa',
//                     done: true
//                 }
//             }
//         }
//     },
//     'name':'asd',
//     age:123
// }
// const obj = {// 迭代器模式
//     store:['sss','ddd','fff'],
//     [Symbol.iterator]:function(){ // iterable
//         const self = this
//         let index = 0;
//         return {
//             next:function(){ // iterator
//                 const result =  { // iterationResult
//                     value: self.store[index],
//                     done: index >= self.store.length
//                 }
//                 index++
//                 return result
//             }
//         }
//     },
//     'name':'asd',
//     age:123
// }

// for (const value of obj) {
//     console.log('循环体',value)  
// }

// const todos = {
//     life:['吃饭','喝水','上厕所'],
//     learn:['语文','数学','英语'],
//     work:['front','back','money'],
//     each:function(callback){
//         const all = [].concat(this.life,this.learn,this.work)
//         for (const item of all) {
//             callback(item) 
//         }
//     },
//     [Symbol.iterator]:function(){// 迭代器，对外提供方法
//         const all = [...this.life,...this.learn,...this.work]
//         let index = 0
//         return {
//             next:function(){
//                 return {
//                     value:all[index],
//                     done:index++ >=all.length
//                 }
//             }
//         }
//     }
// }

// todos.each(function(item){
//     console.log(item)
// })

// for (const item of todos) {
//     console.log(item)
// }

// function *foo(){
//     console.log('zxc')
//     return 100
// }

// const result = foo()
// console.log(result.next())
// console.log(result.next())
// console.log(result.next())

// function *foo(){ // 生成器会返回生成器对象，遇到yield会暂停
//     console.log('111111')
//     yield 100
//     console.log('22222')
//     yield 200
//     console.log('333333')
//     yield 300
// }

// const generator = foo()
// console.log(generator.next())
// console.log(generator.next())
// console.log(generator.next())
// console.log(generator.next())
// 特点：惰性执行，调一下执行一下

// 自增发号器

// iterator方法
const todos = {
    life:['吃饭','喝水','上厕所'],
    learn:['语文','数学','英语'],
    work:['front','back','money'],
    each:function(callback){
        const all = [].concat(this.life,this.learn,this.work)
        for (const item of all) {
            callback(item) 
        }
    },
    [Symbol.iterator]:function*(){// 迭代器，对外提供方法
        const all = [...this.life,...this.learn,...this.work]
        for (const value of all) {
            yield value
        }
    }
}
for (const value of todos) {
    console.log(value)
}
